레코드(Record)
✒️ 2025-05-23 20:38 내용 수정
참고 자료 : Geeksforgeeks What are Java Records and How to Use them Alongside Constructors and Methods?, 마스터포포's Java Record Class란?
불변(Immutable) 데이터를 정의할 수 있는 클래스
- JDK 16에서 정식으로 등록되었다.
- 모듈 간의 데이터를 빠르게 전송할 데이터 전송 목적의 클래스로 POJOs(Plain Old Java Objects)나 DTOs(Data Transfer Objects)를 표현할 때 사용한다.
public record Person(int id, String name) {}
- 인스턴스 필드는 레코드의 매개변수로 작성한다.
- 두 코드를 비교해보면 레코드의 매개변수는 클래스의 필드와 같다.
// 레코드로 생성
public recored Person(int id, String name) {}
// 클래스로 생성
public class Person {
private int id;
private String name;
}
- Compiler는 레코드 생성 시 컴파일 타임 때 생성자,
getter()메서드,toString(),equals(),hashCode()메서드를 자동으로 생성한다.setter()의 경우 레코드 생성 시 매개변수로 필드 값을 넘겨주기 때문에 자동으로 생성되지 않는다.
getter()의 경우 일반적인getField()형식이 아닌field()이름의 형식이다.
public class Main {
// 레코드 생성
public record Person(int id, String name) {}
public static void main(String[] args) {
Person person = new Person(123, "Kim");
System.out.println("id: " + person.id);
System.out.println("id by getter: " + person.id());
System.out.println("name: " + person.name);
System.out.println("name by getter: " + person.name());
System.out.println(person.toString());
}
}
id: 123
id by getter: 123
name: Kim
name by getter: Kim
Person[id=123, name=Kim]
- 레코드는 Compiler에 의해 바이트코드로 변환될 때
.class파일은 레코드 클래스의 정의를 상속받아 구현된다.- 코드는 참고 자료에 나와있는 내용을 가져왔다.
- 여기서 class가
final로 되어 있기 때문에 레코드는 다른 클래스에게 상속할 수 없다.
public final class Employee extends java.lang.Record {
private final int id;
private final java.lang.String firstName;
private final java.lang.String lastName;
static int empToken;
public Employee(int id, java.lang.String firstName, java.lang.String lastName) { /* compiled code */ }
public Employee(int id, java.lang.String firstName) { /* compiled code */ }
public void getFullName() { /* compiled code */ }
public static int generateEmployeeToken() { /* compiled code */ }
public int id() { /* compiled code */ }
public java.lang.String firstName() { /* compiled code */ }
public java.lang.String lastName() { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
}
생성자와 멤버
- 일반 클래스처럼 레코드에도 일반 메서드와 정적 메서드를 추가할 수 있다.
- 정적 필드를 추가할 수 있다.
- 기본 생성자 외에 오버로드한 보조 생성자를 만들 수 있다.
import java.util.Date;
public class Main {
// 레코드 생성
public record Person(int id, String name, Date date) {
// static 필드 추가
static Date now = new Date();
// 보조 생성자 추가
public Person(int id, String name) {
// 기본 생성자 호출
this(id, name, now);
}
// 메서드 추가
public void greet() {
System.out.println("Welcome! [" + now + "]");
System.out.println(id + " | " + name);
}
}
public static void main(String[] args) {
Person person = new Person(123, "Kim");
person.greet();
}
}
Welcome! [Fri May 23 20:31:49 KST 2025]
123 | Kim